package com.adinall.dsp.core.data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.cloudcross.ssp.common.utils.PropertiesUtils;

/**
 * 分页BEAN
 * 
 * @author 高万超
 * @version V1.01 $ 2011-10-25 下午11:33:59
 */
public class Page<T> implements Serializable {

    /** 数据列表 */
    private List<T> data = new ArrayList<T>();

    /** 当前页 */
    private int no = 1;

    /** 每页数据量 */
    private int size = PropertiesUtils.getIntProperty("/config.properties", "page.size.def", 10);

    /** 总数据量 */
    private int count;

    /** 总页数 */
    private int pageCount;

    /** 每页开始 */
    private int recordStart;

    /** 是否有上一页 */
    private boolean hasPrev;

    /** 是否有下一页 */
    private boolean hasNext;

    /** 页号（开始） */
    private int start;

    /** 页号（结束） */
    private int end;

    /** 是否限制每页大小:TRUE-限制；FALSE-不限制；默认-限制 */
    private boolean limit;

    /**
     * 默认构造器
     */
    public Page() {

    }

    public Page(int no, int size, int count) {
        this.no = no;
        this.size = size;
        this.count = count;
        this.limit = true;
        execute();
    }

    /**
     * 计算分页各种属性
     */
    public void execute() {

        if (no <= 0) {
            no = 1;
        }

        if (size <= 0) {
            size = PropertiesUtils.getIntProperty("/config.properties", "page.size.def", 10);
        }

        if (limit) {
            int max_size = PropertiesUtils.getIntProperty("/config.properties", "page.size.max", 100);
            if (size > max_size) {
                size = max_size;
            }
        }

        if (count == 0) {
            recordStart = 0;
            return;
        }

        if (count % size == 0) {
            pageCount = count / size;
        } else {
            pageCount = count / size + 1;
        }

        if (no > pageCount) {
            no = pageCount;
        }

        recordStart = (no - 1) * size;
        recordStart = Math.max(0, recordStart);

        if (pageCount > 1) {
            hasPrev = no > 1;
            hasNext = no < pageCount;
        }

        // 最多显示5页
        int page = 5;
        start = Math.max(no - 2, 1);
        end = Math.min(start + page - 1, pageCount);
        start = Math.max(1, end - page + 1);
    }

    /**
     * 数据列表的取得
     * 
     * @return List<T> 数据列表
     */
    public List<T> getData() {
        return data;
    }

    /**
     * 数据列表的设定
     * 
     * @param data
     *            数据列表
     */
    public void setData(List<T> data) {
        this.data = data;
    }

    /**
     * 当前页的取得
     * 
     * @return int 当前页
     */
    public int getNo() {
        return no;
    }

    /**
     * 当前页的设定
     * 
     * @param no
     *            当前页
     */
    public void setNo(int no) {
        this.no = no;
    }

    /**
     * 每页数据量的取得
     * 
     * @return int 每页数据量
     */
    public int getSize() {
        return size;
    }

    /**
     * 每页数据量的设定
     * 
     * @param size
     *            每页数据量
     */
    public void setSize(int size) {
        this.size = size;
    }

    /**
     * 总数据量的取得
     * 
     * @return int 总数据量
     */
    public int getCount() {
        return count;
    }

    /**
     * 总数据量的设定
     * 
     * @param count
     *            总数据量
     */
    public void setCount(int count) {
        this.count = count;
    }

    /**
     * 总页数的取得
     * 
     * @return int 总页数
     */
    public int getPageCount() {
        return pageCount;
    }

    /**
     * 总页数的设定
     * 
     * @param pageCount
     *            总页数
     */
    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    /**
     * 每页开始的取得
     * 
     * @return int 每页开始
     */
    public int getRecordStart() {
        return recordStart;
    }

    /**
     * 每页开始的设定
     * 
     * @param recordStart
     *            每页开始
     */
    public void setRecordStart(int recordStart) {
        this.recordStart = recordStart;
    }

    /**
     * 是否有上一页的取得
     * 
     * @return boolean 是否有上一页
     */
    public boolean isHasPrev() {
        return hasPrev;
    }

    /**
     * 是否有上一页的设定
     * 
     * @param hasPrev
     *            是否有上一页
     */
    public void setHasPrev(boolean hasPrev) {
        this.hasPrev = hasPrev;
    }

    /**
     * 是否有下一页的取得
     * 
     * @return boolean 是否有下一页
     */
    public boolean isHasNext() {
        return hasNext;
    }

    /**
     * 是否有下一页的设定
     * 
     * @param hasNext
     *            是否有下一页
     */
    public void setHasNext(boolean hasNext) {
        this.hasNext = hasNext;
    }

    /**
     * 页号（开始）的取得
     * 
     * @return int 页号（开始）
     */
    public int getStart() {
        return start;
    }

    /**
     * 页号（开始）的设定
     * 
     * @param start
     *            页号（开始）
     */
    public void setStart(int start) {
        this.start = start;
    }

    /**
     * 页号（结束）的取得
     * 
     * @return int 页号（结束）
     */
    public int getEnd() {
        return end;
    }

    /**
     * 页号（结束）的设定
     * 
     * @param end
     *            页号（结束）
     */
    public void setEnd(int end) {
        this.end = end;
    }

    /**
     * 是否限制每页大小的取得
     * 
     * @return boolean 是否限制每页大小
     */
    public boolean isLimit() {
        return limit;
    }

    /**
     * 是否限制每页大小的设定
     * 
     * @param limit
     *            是否限制每页大小
     */
    public void setLimit(boolean limit) {
        this.limit = limit;
    }
}